#ifndef _MX22A_H
#define _MX22A_H

/* ------------------------------------------- 
   标准库头文件
-------------------------------------------- */
#include <stdlib.h>         // 提供标准库函数，如动态内存分配等
#include <string.h>         // 提供字符串处理函数
#include <stdio.h>          // 提供输入输出函数，如打印日志等
#include <time.h>           // 提供时间相关函数，如时间戳等

/* ------------------------------------------- 
   外部硬件库
-------------------------------------------- */
#include "main.h"           // 主硬件初始化相关头文件
#include "usart.h"          // 串口通信相关头文件
#include "dma.h"            // DMA（直接内存存取）相关功能头文件

/* ------------------------------------------- 
   FreeRTOS相关头文件
-------------------------------------------- */
#include "FreeRTOS.h"       // FreeRTOS核心功能头文件
#include "task.h"           // FreeRTOS任务管理相关功能
#include "queue.h"          // FreeRTOS队列管理相关功能
#include "cmsis_os2.h"

/* ------------------------------------------- 
   自定义库头文件
-------------------------------------------- */
//#include "MyTask.h"         // 自定义任务管理头文件
#include "cJSON.h"          // JSON数据解析库头文件，用于处理JSON格式的数据

/* ------------------------------------------- 
   宏定义
-------------------------------------------- */
#define RX_BUF_SIZE    256  // 定义接收缓冲区大小为256字节

extern osMessageQueueId_t BtComRxQueueHandle;
extern osMessageQueueId_t BtResRxQueueHandle;
#define BT_COM_RX_QUEUE_HANDLE		BtComRxQueueHandle
#define BT_RES_RX_QUEUE_HANDLE		BtResRxQueueHandle

/* ------------------------------------------- 
   数据结构定义
-------------------------------------------- */

/**
  * @brief 蓝牙信息结构体
  * @details 存储蓝牙地址、主机ID及连接状态标志
  */
typedef struct {
    uint8_t BT_Add[30];    // 蓝牙地址（最多支持30字节）
    uint8_t hostId[128];   // 主机ID（最多支持128字节）
    uint8_t connect_flag;  // 连接状态标志（0为未连接，1为已连接）
} bt_info;

/**
  * @brief 接收数据结构体
  * @details 存储接收到的数据及其长度
  */
typedef struct {
    uint8_t rx_data[RX_BUF_SIZE];  // 接收数据缓冲区
    uint16_t data_len;             // 数据长度
} rx_struct;

/* ------------------------------------------- 
   函数声明
-------------------------------------------- */

/**
  * @brief 获取蓝牙接收DMA缓冲区
  * @retval 返回指向接收DMA缓冲区的指针
  */
uint8_t * bt_get_rx_dma_buffer(void);

/**
  * @brief 获取当前蓝牙信息
  * @retval 返回指向当前蓝牙信息的指针
  */
bt_info * bt_get_current_info(void);

/**
  * @brief 发送命令至蓝牙模块，无返回响应
  * @param cmd 需要发送的命令
  * @retval 若发送成功，返回1；否则返回0
  */
_Bool send_com_NoResp(uint8_t *cmd);

/**
  * @brief 发送AT指令至蓝牙模块，并等待指定的响应
  * @param at_command AT指令
  * @param res 预期响应
  * @param retry 重试次数
  * @param xWait 等待响应的最大时间
  * @retval 若成功收到预期响应，返回1；否则返回0
  */
_Bool send_at_command(uint8_t *at_command, uint8_t* res, uint8_t retry, TickType_t xWait);

/**
  * @brief 发送命令至蓝牙模块，并接收响应数据
  * @param cmd 需要发送的命令
  * @param res 预期响应
  * @param retry 重试次数
  * @param xWait 等待响应的最大时间
  * @param outBuf 接收响应数据的缓冲区
  * @param outLen 响应数据的长度
  * @retval 若成功收到预期响应，返回1；若出现错误，返回-1；否则返回0
  */
int send_com_WithResp(uint8_t* cmd, uint8_t* res, uint8_t retry, TickType_t xWait, uint8_t* outBuf, size_t * outLen);

/**
  * @brief 初始化蓝牙模块
  * @retval 若初始化成功，返回1；否则返回0
  */
_Bool ble_module_init(void);

#endif // _MX22A_H
